Системы контроля версий

Кирилл Корняков (Itseez, ННГУ)
3 Марта 2016

Содержание

  1. Системы контроля версий
  2. Git
  3. Модели рабочего процесса (командная работа)
  4. Заключение

Тест Джоэла

Joel Spolsky, August 09, 2000

Коллективная работа с кодом

  1. История изменений
    • Откат дефектных изменений
    • Извлечение кода "из прошлого" (как оно раньше работало?)
    • Поиск ошибок сравнением (кто это сделал?)
  2. Централизованное хранение
    • Актуальное и используемое всеми участниками (где последняя версия?!)
    • Защищенное, с разграничением прав доступа


Машина времени и сетевое хранилище в одном флаконе!
Нужны ли специальные инструменты? Вспоминаем Sharepoint, tarballs.

Системы контроля версий

Системы контроля версий — это программные системы, хранящие несколько версий одного документа, и позволяющие вернуться к более ранним версиям. Как правило, для каждого изменения запоминается дата модификации и автор.

Патчи

Патч (англ. patch — заплатка) — информация, предназначенная для автоматизированного внесения определённых изменений в компьютерные файлы.

Unified diff format: @@ -l,s +l,s @@ optional section heading

Отображение на GitHub

Отображение в командной строке

Патчи

Патчи и СКВ

История изменений

ddc4a1dReadme bug fixes.

 - README.md

f9e76e6Remove dummy implementation

 - include/filters.hpp
 - samples/matrix_sample.cpp
 - src/filters_dummy.cpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

aa1611bSwitch from strings to enums

 - include/filters.hpp
 - samples/matrix_sample.cpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

8e8b21bAdd some error checking

 - include/filters.hpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

Последовательность патчей — это полная история проекта.

Визуализация истории изменений

Три поколения СКВ

Generation Networking Operations Concurrency Examples

First

None

One file at a time

Locks

RCS, SCCS

Second

Centralized

Multi-file

Merge before commit

CVS, Subversion, SourceSafe, Team Foundation Server

Third

Distributed

Changesets

Commit before merge

Git, Mercurial, Bazaar

Eric Sink "A History of Version Control"

Три поколения СКВ: Локальные

Три поколения СКВ: Централизованные

Три поколения СКВ: Распределенные

Преимущества распределенных СКВ (DVCS)

  1. Допускают локальную работу (коммиты без наличия интернет)
  2. Упрощают слияние (а значит параллельную разработку)
  3. Дают максимальную свободу по организации рабочего процесса (workflow)

Благодаря этому, они фактически стали стандартом де-факто.

Популярные СКВ

Stack Overflow Developer Survey 2015

Компании и проекты, использующие Git

Git

  • Разработан Линусом Торвальдсом для работы над ядром Linux в 2005 году.
  • В настоящее время поддерживается Джунио Хамано, сотрудником Google.
  • Не очень прост в освоении, однако очень быстрый и функциональный.
  • Имеет наиболее "сильное" сообщество, инструментальную поддержку.
  • Огромное количество информации в интернет: инструкции, уроки, статьи
  • Официальный сайт проекта: http://www.git-scm.org.

Pro Git

  • Лучшая книга про Git
  • Доступна бесплатно
  • Переведена на русский язык
  • Единственный способ по-настоящему понять Git — это узнать как он работает
  • Нужно прочесть хотя бы первые 100 страниц

Как сказал Евклид египетскому царю Птолемею:

«Царской дороги в геометрии нет!»

Atlassian SourceTree

Tortoise Git

GitHub Desktop

Command Line Interface!

Git objects

Показать содержимое коммита:

$ git show --raw dc2ca9d95c

commit dc2ca9d95cbd5586e9e5ef0fe1ce7db91ea7d3d1
Author: Daniil Osokin <daniil.osokin@itseez.com>
Date:   Sun Aug 16 14:35:44 2015 +0300

    Switched to factory

:100644 100644 afadff2... bde857e... M  README.md
:100644 000000 c977bf3... 0000000... D  src/filters_fabrics.cpp
:000000 100644 0000000... c977bf3... A  src/filters_factory.cpp

Git commits

Вывести историю изменений:

$ git log

commit aaa321be9191da60ad52c2bc41bd749ed546b409
Merge: 98fce98 3c1d15a
Author: Valentina <valentina-kustikova@users.noreply.github.com>
Date:   Thu Aug 13 10:14:47 2015 +0300

    Merge pull request #11 from valentina-kustikova/master

    Practice description (bug fixes).

commit 3c1d15a1bf366864593f2320fa9a0e6cf3586f52
Author: valentina-kustikova <valentina.kustikova@gmail.com>
Date:   Thu Aug 13 10:08:59 2015 +0300

    Practice description (bug fixes).

Понятие ветки (branch)

Вывести список существующих веток:

$ git branch
* master

Git branch

Создать новую ветку с именем testing (указатель на коммит!):

$ git branch testing

Текущий список веток:

$ git branch
* master
  testing

Git checkout

Извлечь состояние репозитория, соответствующее ветке testing:

$ git checkout testing

Вывести список существующих веток:

$ git branch
  master
* testing

Три состояния файлов

Git commit

$ vim README.md
$ git add README.md
$ git commit -m 'Made a change'

Go back to master

$ git checkout master

Make a commit to master

$ vim main.cpp

$ git add main.cpp
$ git commit -m 'Made other changes'

# Или можно сделать так
$ git status
$ git commit -a -m 'Made other changes'

Merging

Merging

Merge Conflicts

Multiple Branches

Распределенная работа

  1. Распределенные рабочие процессы (workflow)
    • Centralized
    • Integration Manager
    • Dictator and Lieutenants
  2. Модели ветвления (branching model)
    • GitFlow
    • GitHub Flow

Centralized Workflow

Плюсы и минусы данного подхода?

Integration Manager Workflow

Плюсы и минусы данного подхода?

Dictator and Lieutenants Workflow

Git Flow

A successful Git branching model (link)

Triangular Workflow (GitHub)

$ cd mp2-lab1-bitfield
$ git remote -v
origin  https://github.com/kirill-kornyakov/mp2-lab1-bitfield.git (fetch)
origin  https://github.com/kirill-kornyakov/mp2-lab1-bitfield.git (push)
upstream  https://github.com/UNN-VMK-Software/mp2-lab1-bitfield.git (fetch)
upstream  https://github.com/UNN-VMK-Software/mp2-lab1-bitfield.git (push)

GitHub Flow

GitHub Flow

GitHub Flow

Anything in the master branch is deployable.

  1. Create branch
    • To work on something new, create a descriptively named branch off of master (ie: new-oauth2-scopes).
  2. Develop in branch
    • Commit to that branch locally and regularly push your work to the same named branch on the server.
  3. Open a pull request (ask for review)
    • When you need feedback or help, or you think the branch is ready for merging, open a pull request.
  4. Merge after review
    • After someone else has reviewed and signed off on the feature, you can merge it into master.
  5. Deploy
    • Once it is merged and pushed to master, you can and should deploy immediately.

GitHub Flow в командах Git

# Check that origin and upstream repositories are correctly defined
$ git remote -v

# Get the latest sources from the upstream repository
$ git remote update

# Checkout a new topic branch for development
$ git checkout -b adding-new-feature upstream/master

#
# Do some development...
#

# Check your changes
$ git status

# Commit your changes
$ git commit -a -m "Added a new feature"

# Push your changes to the origin
$ git push origin HEAD

Базовые принципы

  1. Приложение строится только на на основе известного состояния репозитория:
    • Не только релизы, но и экспериментальные и тестовые сборки (builds).
    • В идеале приложение умеет сообщать свою ревизию и параметры сборки.
  2. Стабильность общих (публичных) веток:
    • Они обязаны компилироваться и проходить все тесты в любой момент времени.
    • Изменения тестируются до попадания в репозиторий.
    • Если дефектные изменения прошли, они исправляются в срочном порядке.
  3. Абсолютно вся разработка фиксируется в истории:
    • Это делается в виде отдельных веток локального или глобального репозитория.
    • "Удачные" изменения добавляются в основную ветвь.
  4. Публичная история проекта не "переписывается":
    • Однажды помеченные тэгами и выпущенные релизы модификации не подлежат.
    • Промежуточная история не переписывается, потому что будут конфликты.

Современное состояние

VCS: Резюме

  1. Системы контроля версий — центральный инструмент разработки
    • Навигация по истории изменений
    • Централизованный доступ
  2. Имеются и другие применения:
  3. Распределенные СКВ фактически стали стандартом. Их сильные стороны:
    • Допускают локальные коммиты (без наличия интернет или доступа к серверу)
    • Упрощают слияние (а значит параллельную разработку)
    • Дают максимальную свободу по организации рабочего процесса (workflow)
  4. Git не самая простая в освоении СКВ, однако очень функциональная,
    к тому же дает максимальную свободу по организации процесса разработки.
  5. Необходимо следовать общепринятым правилам и практикам, в особенности относительно публичных репозиториев и релизов.
  6. Каждому проекту следует выработать свой рабочий процесс и правила именования веток. При этом желательно основываться на популярных подходах.

Контрольные вопросы

  1. Определение СКВ
  2. Основные функции/возможности современных СКВ
  3. Преимущества DVCS
  4. Базовые принципы корректной работы с СКВ
  5. Рабочий процесс (модель ветвления), используемый в компании GitHub

Ссылки

  1. Wikipedia "Системы контроля версий".
  2. Pro Git by Scott Chacon.
  3. "Mercurial tutorial" by Joel Spolsky.

Спасибо!

Вопросы?